package com.example.deepschool.util;

import com.example.deepschool.Model.Discussion;
import com.example.deepschool.Model.Order;
import com.example.deepschool.Model.Report;
import com.example.deepschool.Model.User;
import com.example.deepschool.enums.GlobalVariables_String;
import com.example.deepschool.enums.ImageType;
import org.springframework.stereotype.Component;

import java.util.Objects;

/**
 * 验证类，提供各种验证功能。
 * 包括令牌验证、密码更新验证和文件类型验证。
 */
@Component
public class Verify {

    /**
     * 验证令牌是否存在。
     *
     * @param token 待验证的令牌字符串。
     * @return 如果令牌存在返回true，否则返回false。
     */
    public static boolean VerifyToken(String token) {
        return Redis.EXISTS(token);
    }

    /**
     * 验证用户密码更新的合法性。
     *
     * @param oldPassword  用户旧密码。
     * @param newPassword  用户新密码。
     * @param newPassword2 用户再次输入的新密码，用于确认。
     * @param user         当前用户对象。
     * @throws RuntimeException 如果旧密码错误或两次输入的新密码不一致，抛出运行时异常。
     */
    public static void VerifyUpdatePassword(String oldPassword, String newPassword, String newPassword2, User user) {
        String password = user.getPassword();
        try {
            if (!oldPassword.equals(password)) {
                throw new Exception("旧密码错误");
            }
            if (!newPassword.equals(newPassword2)) {
                throw new Exception("两次新密码不一致");
            }
        } catch (Exception ex) {
            throw new RuntimeException(ex.getMessage());
        }
    }

    /**
     * 验证文件类型是否为允许的图片类型。
     *
     * @param type 待验证的文件类型字符串。
     * @return 如果文件类型合法返回true，否则返回false。
     */
    public static boolean VerifyFileType_Image(String type) {
        for (ImageType ImageType : ImageType.values()) {
            if (type.equals(ImageType.getValue())) {
                return true;
            }
        }
        return false;
    }

    /**
     * 验证要上传的文件是否存在于资源文件夹中
     *
     * @param fileSHA256 要验证的文件哈希值
     * @return 如果文件存在返回true，否则返回false。
     */
    public static String VerifyFileIsExistCourseResource (String fileSHA256) {
        String Image = null;
        String Video = null;
        String Other = null;
        String Path = GlobalVariables_String.File_Path_CourseResource.getValue();
        Image = IO.isFileExist(Path + GlobalVariables_String.CourseResource_Image.getValue() + fileSHA256) ? GlobalVariables_String.CourseResource_Image.getValue() + fileSHA256 : null;
        Video = IO.isFileExist(Path + GlobalVariables_String.CourseResource_Video.getValue() + fileSHA256) ? GlobalVariables_String.CourseResource_Video.getValue() + fileSHA256 : null;
        Other = IO.isFileExist(Path + GlobalVariables_String.CourseResource_Other.getValue() + fileSHA256) ? GlobalVariables_String.CourseResource_Other.getValue() + fileSHA256 : null;
        if (Image != null) {
            return Image;
        }
        if (Video != null) {
            return Video;
        }
        return Other;
    }

    public static void VerifyReportAdd(Report report){
        if(report.getReportedUserId()==null){
            throw new RuntimeException("被举报者ID，不能为空");
        }
        if(report.getReportedContentId()==null){
            throw new RuntimeException("被举报的内容不能为空");
        }
        if(report.getReason()==null){
            throw new RuntimeException("举报原因不能为空");
        }
    }

    public static void VerifyReportUpdate(Report report){
        if(report.getId()==null){
            throw new RuntimeException("要处理的举报ID不能为空.");
        }
        if(report.getResult()==null){
            throw new RuntimeException("处理结果不能为空.");
        }
        if(!Objects.equals(report.getStatus(), "已处理") && !Objects.equals(report.getStatus(), "已拒绝")){
           throw new RuntimeException("处理的状态只能为：已处理、已拒绝 两种状态之一");
        }
    }
	
	
}
